במדריך הנ"ל אני אסביר על העלאת קבצים בעזרת YII
הרבה זמן לא כתבתי מדריך, כי לא ממש יצא לי
אבל פתאום יש לי חשק לכתוב מדריך!
העלאת קבצים
במדריך הזה אני אלמד אותכם איך לעלות קבצים ע"י YII
אז יחסית פשוט.
דרוש:
- ידע על טפסים בעזרת YII (למדתי את זה כבר)
טוב אז ככה
דבר ראשון ניצור את הACTION שלנו
<?php
class SiteContoller extends CController
{
public function actionUpload()
{
$this->renderText('check');
}
}
?>
class SiteContoller extends CController
{
public function actionUpload()
{
$this->renderText('check');
}
}
?>
עכשיו נבדוק אם זה ידפיס לנו CHECK אם לא אז... זה משהו שהסברתי בחלק הראשון של הסדרת מדריכים
טוב, עכשיו בואו ניצור את הMODEL של הקובץ שלנו
<?php
class UploadForm extends CFormModel
{
public $image;
private $_identity;
}
?>
class UploadForm extends CFormModel
{
public $image;
private $_identity;
}
?>
כמו שניתן לראות עשיתי משתנה לתמונה שלנו בטופס
עכשיו צריך לטפל בRULES כדי שהMODEL יהיה מודע לזה שזה תמונה
<?php
class UploadForm extends CFormModel
{
public $image;
private $_identity;
public function rules()
{
return array(
array('image', 'file')
);
}
}
class UploadForm extends CFormModel
{
public $image;
private $_identity;
public function rules()
{
return array(
array('image', 'file')
);
}
}
ככה אנו מודיעים לMODEL שIMAGE צריך להיות FILE (קובץ)
עכשיו, בואו נגדיר משקל דרוש לתמונה, זאת אומרת נגיד אני רוצה שגודל הקובץ יהיה חייב להיות בין 1~2MB
אז עושים את זה ככה:
<?php
class UploadForm extends CFormModel
{
public $image;
private $_identity;
public function rules()
{
return array(
array('image', 'file',
'maxSize' => 2097152,
'minSize' => 1048576,
'tooLarge' => 'גודל הקובץ חייב להיות קטן מ2 מגה בית',,
'tooSmall' => 'גודל הקובץ חייב להיות 1 מגה בית מינימום'
)
);
}
}
class UploadForm extends CFormModel
{
public $image;
private $_identity;
public function rules()
{
return array(
array('image', 'file',
'maxSize' => 2097152,
'minSize' => 1048576,
'tooLarge' => 'גודל הקובץ חייב להיות קטן מ2 מגה בית',,
'tooSmall' => 'גודל הקובץ חייב להיות 1 מגה בית מינימום'
)
);
}
}
עכשיו שימו לב! גודל הקובץ חייב להיות בBYTE!
maxSize - הגודל הכי גדול שאפשר (אם לא מכניסים זה ללא הגבלה)
minSize - הגדול הכי קטן שאפשר (אם לא מכניסים זה ללא הגבלה)
tooLarge - ההודעה כאשר גודל הקובץ גדול מידי
tooSmall - הודעה כאשר גודל הקובץ קטן מידי
---------------------------------------------------------------------------------------------
עכשיו צריך לבדוק אם הקבצים הם תמונה שזה ע"י השדה types
<?php
class UploadForm extends CFormModel
{
public $image;
private $_identity;
public function rules()
{
return array(
array('image', 'file',
'maxSize' => 2097152,
'minSize' => 1048576,
'tooLarge' => 'גודל הקובץ חייב להיות קטן מ2 מגה בית',,
'tooSmall' => 'גודל הקובץ חייב להיות 1 מגה בית מינימום',
'types' => 'jpg, jpeg, gif, png, ico',
'wrongType' => 'ניתן לבחור קובץ רק מסוג: jpg, jpeg, gif, png, ico'
)
);
}
}
?>
class UploadForm extends CFormModel
{
public $image;
private $_identity;
public function rules()
{
return array(
array('image', 'file',
'maxSize' => 2097152,
'minSize' => 1048576,
'tooLarge' => 'גודל הקובץ חייב להיות קטן מ2 מגה בית',,
'tooSmall' => 'גודל הקובץ חייב להיות 1 מגה בית מינימום',
'types' => 'jpg, jpeg, gif, png, ico',
'wrongType' => 'ניתן לבחור קובץ רק מסוג: jpg, jpeg, gif, png, ico'
)
);
}
}
?>
types - רשימת סוגי הקבצים
wrongType - השגיאה שמקבלים אם בוחר סוג קובץ לא נכון
-------------------------------------------------
בואו נחזור אל הController וניצור משתנה לFORM
<?php
class SiteContoller extends CController
{
public function actionUpload()
{
$model = new UploadForm();
$this->render('form',array('model'=>$model));
}
}
?>
class SiteContoller extends CController
{
public function actionUpload()
{
$model = new UploadForm();
$this->render('form',array('model'=>$model));
}
}
?>
וניצור את הview
<?php $form = $this->beginWidget('CActiveForm', array('htmlOptions'=>array('enctype'=>'multipart/form-data'))); ?>
<?php echo $form->errorSummary($model); ?>
<?php echo $form->fileField($model, 'image'); ?>
<br />
<?php echo CHtml::submitButton('העלאה תמונה'); ?>
<?php $this->endWidget(); ?>
<?php echo $form->errorSummary($model); ?>
<?php echo $form->fileField($model, 'image'); ?>
<br />
<?php echo CHtml::submitButton('העלאה תמונה'); ?>
<?php $this->endWidget(); ?>
שמים למשהו שונה?
אוקיי דבר ראשון כן צריך להוסיף את הקטע עם enctype כאשר מעלים קובץ
וגם כדי להציג input של file משתמשים בfileField
ועכשיו נחזור לCONTROLLER
<?php
class SiteContoller extends CController
{
public function actionUpload()
{
$model = new UploadForm();
if(isset($_POST['UploadForm']))
{
$model->attributes = $_POST['UploadForm'];
}
$this->render('form',array('model'=>$model));
}
}
?>
class SiteContoller extends CController
{
public function actionUpload()
{
$model = new UploadForm();
if(isset($_POST['UploadForm']))
{
$model->attributes = $_POST['UploadForm'];
}
$this->render('form',array('model'=>$model));
}
}
?>
ועכשיו משהו חדש, נגיד את המשתנה IMAGE של הFORM בתור תמונה
ואנחנו נעשה את זה ככה:
<?php
class SiteContoller extends CController
{
public function actionUpload()
{
$model = new UploadForm();
if(isset($_POST['UploadForm']))
{
$model->attributes = $_POST['UploadForm'];
$model->image = CUploadedFile::getInstance($model, 'image');
}
$this->render('form',array('model'=>$model));
}
}
?>
class SiteContoller extends CController
{
public function actionUpload()
{
$model = new UploadForm();
if(isset($_POST['UploadForm']))
{
$model->attributes = $_POST['UploadForm'];
$model->image = CUploadedFile::getInstance($model, 'image');
}
$this->render('form',array('model'=>$model));
}
}
?>
ועכשיו נעלה את הקובץ
<?php
class SiteContoller extends CController
{
public function actionUpload()
{
$model = new UploadForm();
if(isset($_POST['UploadForm']))
{
$model->attributes = $_POST['UploadForm'];
$model->image = CUploadedFile::getInstance($model, 'image');
if($model->validate())
{
$name = $model->image->name;
$model->image->saveAs('images/'.$name);
}
}
$this->render('form',array('model'=>$model));
}
}
?>
class SiteContoller extends CController
{
public function actionUpload()
{
$model = new UploadForm();
if(isset($_POST['UploadForm']))
{
$model->attributes = $_POST['UploadForm'];
$model->image = CUploadedFile::getInstance($model, 'image');
if($model->validate())
{
$name = $model->image->name;
$model->image->saveAs('images/'.$name);
}
}
$this->render('form',array('model'=>$model));
}
}
?>
הסבר
בדקתי אם התנאים עבדו כמו שצריך (הסברתי על זה כבר במדריכים קודמים)
וקלטתי את שם הקובץ, כדאי לעלות אותו
שזה פשוט המשתנה name
והעליתי אותו שזה מבצעים ע"י הפונקציה saveAs והוא קולט string שזה המיקום של התמונה
====================================================================
עכשיו נגיד אנחנו רוצים לא להכריח את המשתמש לבחור תמונה, נגיד שזה אופציה לא חובה
אז דבר ראשון נוסיף לcontroller את הallowEmpty ונכניס true
כאילו ככה
'allowEmpty' => true
ונעשה בדיקה בCONTROLLER
<?php
class SiteContoller extends CController
{
public function actionUpload()
{
$model = new UploadForm();
if(isset($_POST['UploadForm']))
{
$model->attributes = $_POST['UploadForm'];
$model->image = CUploadedFile::getInstance($model, 'image');
if($model->validate())
{
if ($model->image !== null) {
$name = $model->image->name;
$model->image->saveAs('images/'.$name);
}
}
}
$this->render('form',array('model'=>$model));
}
}
?>
class SiteContoller extends CController
{
public function actionUpload()
{
$model = new UploadForm();
if(isset($_POST['UploadForm']))
{
$model->attributes = $_POST['UploadForm'];
$model->image = CUploadedFile::getInstance($model, 'image');
if($model->validate())
{
if ($model->image !== null) {
$name = $model->image->name;
$model->image->saveAs('images/'.$name);
}
}
}
$this->render('form',array('model'=>$model));
}
}
?>
אז מה עשיתי פה בעצם?
פשוט עשיתי תנאי ובדקתי אם הערך של התמונה הוא לא ריק
וזה הכל :) אשמח לתגובות
תגובות לכתבה:
תודה,
יש תמיכה ב multiupload ?
כן יש תמיכה בmultiupload אתה פשוט מגדיר בrules את הmaxFiles בתור הכמות הקבצים האפשרים
תודה :) אחלה מדריך
תודה רבה, מדריך מעולה !